package com.hspedu.InnerClass;

/**
 * @Author Stringzhua
 * @Date 2024/3/6 17:29
 * description:成员内部类
 * 1.成员内部类可以直接访问外部类的所有成员,包括私有的
 * 2.可以添加任意访问修饰符(public protected 默认 private) 【原因:它的地位就是一个成员】
 */
public class MemberInnerClass01 {//外部其他类

    public static void main(String[] args) {
        Outer08 outer08 = new Outer08();
        outer08.t1();
        //外部其他类使用成员内部类的两种方式
        //第一种方式:
        //outer08.new Inner08();-->相当于把new Inner08()当作是outer08的成员
        //这是语法
        Outer08.Inner08 inner08 = outer08.new Inner08();
        inner08.say();
        //第二种方式 在外部类种编写一个方法可以返回一个Inner08的对象
        Outer08.Inner08 inner08Instance= outer08.getInner08Instance();
        inner08Instance.say();
    }
}

class Outer08 {//外部类
    private int n1 = 10;
    public String name = "张三";

    private void hi() {
        System.out.println("hi()方法...");
    }
    //注意:成员内部类是定义在外部类的成员位置上

    public class Inner08 {//成员内部类
        private double sal = 99.8;
        private int n1=66;//就近原则

        public void say() {
            //1.成员内部类可以直接访问外部类的所有成员,包括私有的
            System.out.println("Outer08 的n1=" + n1 + "  Outer08 的name=" + name);
            //如果成员内部类和外部类的成员重名,会遵守就近原则
            //可以通过外部类名.this来访问外部类的成员
            System.out.println("外部类的 的n1=" + Outer08.this.n1);
            hi();
        }
    }

    //第二种方式:该方法直接返回一个Inner08()的实例
    public Inner08 getInner08Instance() {
        return new Inner08();
    }

    //写方法
    public void t1() {
        //使用成员内部类
        //创建成员内部类的对象,然后使用相关的方法
        Inner08 inner08 = new Inner08();
        inner08.say();
        System.out.println(inner08.sal);
    }
}
